package controllers.Administrador;

import java.util.Collection;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import services.ComunidadDeVecinosService;
import services.PresupuestoService;
import controllers.AbstractController;
import domain.ComunidadDeVecinos;
import domain.Pago;
import domain.Presupuesto;
import forms.ComunidadDeVecinosForm;

@Controller
@RequestMapping("/comunidad/administrator")
public class ComunidadesAdministratorController extends AbstractController {

	@Autowired
	private ComunidadDeVecinosService comunidadDeVecinosService;
	@Autowired
	private PresupuestoService presupuestoService;

	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public ModelAndView list() {
		ModelAndView result;
		Collection<ComunidadDeVecinos> comunidades;

		comunidades = comunidadDeVecinosService.findAll();

		result = new ModelAndView("comunidad/list");
		result.addObject("requestURI", "comunidad/administrator/list.do");
		result.addObject("comunidades", comunidades);
		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	// Creation
	@RequestMapping(value = "/create", method = RequestMethod.GET)
	public ModelAndView create() {
		ModelAndView result;
		ComunidadDeVecinosForm cvForm;
		Collection<Presupuesto> presupuestos;
		Boolean isNew;
		Boolean eraseable;

		presupuestos = presupuestoService.findPresupuestoServicioAsytec();
		cvForm = comunidadDeVecinosService.createForm();

		isNew = true;
		eraseable = false;

		result = new ModelAndView("comunidad/create");
		result.addObject("cvForm", cvForm);
		result.addObject("presupuestos", presupuestos);
		result.addObject("isNew", isNew);
		result.addObject("eraseable", eraseable);
		result.addObject("requestURI", "comunidad/administrator/edit.do");
		result.addObject("backURI", "/welcome/index.do");

		return result;

	}

	// Edition
	@RequestMapping(value = "/edit", method = RequestMethod.GET)
	public ModelAndView edit(@RequestParam int comunidadId) {
		ModelAndView result;
		ComunidadDeVecinosForm cvForm;
		ComunidadDeVecinos cv;
		Boolean hasPresident;

		cv = comunidadDeVecinosService.findOne(comunidadId);
		cvForm = comunidadDeVecinosService.comunidadToForm(cv);
		hasPresident = cv.getPresidente() != null;

		result = new ModelAndView("comunidad/edit");
		result.addObject("cvForm", cvForm);
		result.addObject("comunidadId", comunidadId);
		result.addObject("hasPresident", hasPresident);
		result.addObject("requestURI", "comunidad/administrator/edit.do");
		result.addObject("backURI", "/welcome/index.do");

		return result;

	}

	@RequestMapping(value = "/edit", method = RequestMethod.POST, params = "save")
	public ModelAndView save(@Valid ComunidadDeVecinosForm cvForm,
			BindingResult binding) {
		ModelAndView result;
		ComunidadDeVecinos cv;
		Boolean isNew;
		Boolean eraseable;
		Collection<Presupuesto> presupuestos;

		if (binding.hasErrors()) {
			result = createEditModelAndView(cvForm);
			result.addObject("erroresBindingComunidad", true);
			for (FieldError error : binding.getFieldErrors()) {
				if (error.getField().equals("cif"))
					result.addObject("cifError", "comunidad.error.cif");
				if (error.getField().equals("direccion"))
					result.addObject("addressError", "comunidad.error.address");
				if (error.getField().equals("numeroDeCuenta"))
					result.addObject("accountError", "comunidad.error.account");
				if (error.getField().equals("importeCuota"))
					result.addObject("feeAmountError",
							"comunidad.error.feeAmount");
				if (error.getField().equals("presupuesto"))
					result.addObject("presupuestoError",
							"comunidad.error.presupuesto");

			}
		} else {
			try {
				cv = comunidadDeVecinosService.reconstruct(cvForm);
				comunidadDeVecinosService.save(cv);
				result = new ModelAndView("redirect:../../");

			} catch (Throwable oops) {

				result = createEditModelAndView(cvForm,
						"comunidad.commit.error");
			}
		}

		presupuestos = presupuestoService.findPresupuestoServicioAsytec();

		isNew = cvForm.getComunidadId() == 0;
		eraseable = false;
		result.addObject("requestURI", "comunidad/administrator/edit.do");
		result.addObject("backURI", "/welcome/index.do");
		result.addObject("presupuestos", presupuestos);
		result.addObject("isNew", isNew);
		result.addObject("eraseable", eraseable);

		return result;
	}

	@RequestMapping(value = "/delete", method = RequestMethod.GET)
	public ModelAndView delete(@RequestParam int comunidadId) {
		ModelAndView result;

		try {

			comunidadDeVecinosService.delete(comunidadId);
			result = new ModelAndView(
					"redirect:/comunidad/administrator/list.do");

		} catch (Throwable oops) {
			Collection<ComunidadDeVecinos> comunidades;

			comunidades = comunidadDeVecinosService.findAll();

			result = new ModelAndView("comunidad/list");
			result.addObject("requestURI", "comunidad/administrator/list.do");
			result.addObject("comunidades", comunidades);
			result.addObject("backURI", "/welcome/index.do");

			ComunidadDeVecinos comunidad;
			comunidad = comunidadDeVecinosService.findOne(comunidadId);
			Boolean pagoPendiente = false;
			for (Pago p : comunidad.getPagos()) {
				if (p.getEstado().equals("No pagado")) {
					if (p.getRazonSocial().equals("Asytec")) {
						result.addObject("message",
								"comunidad.pagoPendienteAsytec.error");
						pagoPendiente = true;
					}
				}
			}
			if (!pagoPendiente) {
				result.addObject("message", "comunidad.commit.error");
			}

		}
		result.addObject("requestURI", "comunidad/administrator/edit.do");
		result.addObject("backURI", "/welcome/index.do");

		return result;
	}

	// Ancillary methods
	protected ModelAndView createEditModelAndView(ComunidadDeVecinosForm cvForm) {
		ModelAndView result;

		result = createEditModelAndView(cvForm, null);

		return result;
	}

	protected ModelAndView createEditModelAndView(
			ComunidadDeVecinosForm cvForm, String message) {
		ModelAndView result;

		if (cvForm.getComunidadId() == 0) {

			result = new ModelAndView("comunidad/create");

		} else {
			result = new ModelAndView("comunidad/edit");
		}

		result.addObject("cvForm", cvForm);
		result.addObject("message", message);

		return result;
	}
}
